package com.urbane.generator.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.api.R;
import com.urbane.generator.entity.Template;
import com.urbane.generator.model.vo.ResponseResult;
import com.urbane.generator.service.TemplateService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 模板文件管理控制器
 * <p>提供前端界面管理代码生成模板（.ftl 文件）的 API 接口</p>
 * <p>支持在线编辑模板内容，保存到数据库</p>
 *
 * @author your-name
 * @date 2024-07-06
 */
@RestController
@RequestMapping("/api/template")
@Tag(name = "系统管理", description = "代码生成平台的系统管理接口")
public class TemplateController {

    @Autowired
    private TemplateService templateService;

    /**
     * 获取所有模板文件
     *
     * @return 所有模板的列表
     * @api {GET} /api/template/list 获取所有模板
     * @apiName ListAllTemplates
     * @apiGroup 系统管理
     */
    @GetMapping("/list")
    @Operation(summary = "获取所有模板文件", description = "查询系统中所有已注册的模板文件，包括系统内置和用户自定义")
    public ResponseResult<List<Template>> listAllTemplates() {
        List<Template> list = templateService.list();
        return ResponseResult.success(list);
    }

    /**
     * 根据模板类型获取模板列表
     *
     * @param type 模板类型（如：JAVA_ENTITY, VUE_LIST, TS_API）
     * @return 指定类型的所有模板
     * @api {GET} /api/template/by-type/{type} 按类型获取模板
     * @apiName GetTemplatesByType
     * @apiGroup 系统管理
     * @apiParam {String} type 模板类型（必须）
     * @apiParamExample {url} 请求示例:
     *     /api/template/by-type/VUE_LIST
     */
    @GetMapping("/by-type/{type}")
    @Operation(summary = "按类型获取模板文件", description = "根据模板类型（如 VUE_LIST, JAVA_ENTITY）查询对应的模板文件列表")
    public ResponseResult<List<Template>> getTemplatesByType(@PathVariable String type) {
        List<Template> list = templateService.getTemplatesByType(type);
        return ResponseResult.success(list);
    }

    /**
     * 保存或更新一个模板文件的内容
     *
     * @param template 模板对象（包含 id, name, type, content）
     * @return 操作结果
     * @api {POST} /api/template/save 保存或更新模板
     * @apiName SaveTemplate
     * @apiGroup 系统管理
     * @apiParamExample {json} 请求示例:
     *     {
     *       "id": 1,
     *       "name": "entity.java.ftl",
     *       "type": "JAVA_ENTITY",
     *       "content": "<#-- 实体类模板 -->\npackage ${package.Entity};\n..."
     *     }
     */
    @PostMapping("/save")
    @Operation(summary = "保存或更新模板", description = "根据模板ID判断是新增还是更新。若ID为空，则新增；若ID存在，则更新内容")
    public ResponseResult<Boolean> save(@RequestBody Template template) {
        boolean success = templateService.saveOrUpdate(template);
        return success ? ResponseResult.success(true) : ResponseResult.fail(404, "保存失败");
    }

    /**
     * 根据模板名称和类型获取模板内容（供前端编辑器加载）
     *
     * @param name 模板文件名（如：entity.java.ftl）
     * @param type 模板类型（如：JAVA_ENTITY）
     * @return 模板的完整内容
     * @api {GET} /api/template/get-content/{name}/{type} 获取模板内容
     * @apiName GetTemplateContent
     * @apiGroup 系统管理
     * @apiParam {String} name 模板文件名（必须）
     * @apiParam {String} type 模板类型（必须）
     * @apiParamExample {url} 请求示例:
     *     /api/template/get-content/entity.java.ftl/JAVA_ENTITY
     */
    @GetMapping("/get-content/{name}/{type}")
    @Operation(summary = "根据名称和类型获取模板内容", description = "用于前端模板编辑器加载指定模板的原始内容")
    public ResponseResult<String> getTemplateContent(@PathVariable String name, @PathVariable String type) {
        String content = templateService.getTemplateContentByNameAndType(name, type);
        if (content == null) {
            return ResponseResult.fail(404, "模板不存在");
        }
        return ResponseResult.success(content);
    }
}